package com.chj.design.sk;

import java.util.ArrayList;
import java.util.List;

public class Code08_Iterator {
	/**
	 * 迭代器接口
	 */
	public interface Iterator<T> {
		/**
		 * 是否还有下一个元素
		 * 
		 * @return
		 */
		boolean hasNext();

		/**
		 * 返回当前位置的元素，并将位置移动到下一位
		 * 
		 * @return
		 */
		T next();
	}

	/**
	 * 具体迭代器
	 */
	public static class ConcreteIterator<T> implements Iterator<T> {

		private List<T> list = new ArrayList<>();

		public ConcreteIterator(List<T> list) {
			this.list = list;
		}

		private int cursor = 0;

		public boolean hasNext() {
			return cursor != list.size();
		}

		public T next() {
			T obj = null;
			if (this.hasNext()) {
				obj = this.list.get(cursor++);
			}
			return obj;
		}

	}

	/**
	 * 容器接口
	 */
	public interface Aggregate<T> {
		/**
		 * 添加一个元素
		 * 
		 * @param obj 元素对象
		 */
		void add(T obj);

		/**
		 * 移除一个元素
		 * 
		 * @param obj 元素对象
		 */
		void remove(T obj);

		/**
		 * 获取容器的迭代器
		 * 
		 * @return 迭代器对象
		 */
		Iterator<T> iterator();
	}

	/**
	 * 具体容器接口
	 */
	public static class ConcreteAggregate<T> implements Aggregate<T> {

		private List<T> list = new ArrayList<>();

		@Override
		public void add(T obj) {
			list.add(obj);
		}

		@Override
		public void remove(T obj) {
			list.remove(obj);
		}

		@Override
		public Iterator<T> iterator() {
			return new ConcreteIterator<T>(list);
		}
	}

	/**
	 * Client类
	 */
//	public class MainClass {

	public static void main(String[] args) {

		Aggregate<String> agt = new ConcreteAggregate<>();
		agt.add("aLin");
		agt.add("jack");
		agt.add("yushao");

		Iterator<String> itr = agt.iterator();
		while (itr.hasNext()) {
			System.out.println(itr.next());
		}
	}

//	}
}
